<?php

use App\Common\Utill\ElasticSearch;
use Illuminate\Support\Facades\DB;
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mime\Email;

//驼峰转下划线
if (!function_exists('unCamelize')) {
    function unCamelize($camelCaps, $separator = '_'): string
    {
        return strtolower(preg_replace('/([a-z])([A-Z])/', "$1".$separator."$2", $camelCaps));
    }
}

//下划线转驼峰
if (!function_exists('camelize')) {
    function camelize($unCamelizedWords,$separator='_'): string
    {
        $unCamelizedWords = $separator. str_replace($separator, " ", strtolower($unCamelizedWords));
        return ltrim(str_replace(" ", "", ucwords($unCamelizedWords)), $separator );
    }
}

//移除参数中的null和''值
if (!function_exists('paramFilter')) {
    function paramFilter($params) {
        if (!empty($params)) {
            foreach ($params as $k => $param) {
                if ($param === '' || $param === null) {
                    unset($params[$k]);
                }
            }
        }
        return $params;
    }
}

/**
 * 随机生茶指定长度的数字和英文字母组合
 * @param $intPwLength
 * @return string
 */
if (!function_exists('createRandString')) {
    function createRandString($intPwLength = 10): string
    {
        $arrRand = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));
        $strRandPwd = '';
        $intArrLen = count($arrRand);
        for ($i = 0; $i < $intPwLength; $i++) {
            $intRand = mt_rand(0, $intArrLen-1);  //mt_rand(min,max)函数返回随机整数
            $strRandPwd .= $arrRand[$intRand];
        }
        return ucfirst($strRandPwd);
    }
}
/**
 * 验证测试手机号验证码
 */
function checkMobileSmsCode($mobile, $smsCode)
{

    $mobileData = [
        17212345678 => 814692,
        17612345678 => 123456,
        16601212452 => 357492,
        18798765432 => 123456,
    ];

    if (isset($mobileData[$mobile])) {
        if ($smsCode != $mobileData[$mobile]) {
            return 500;
        }
        return 200;
    }

    if (config('app')['env'] == 'prod') {
        //判断$smsCode验证码是否有效，
        $sms_service = new SmsService();
        $check_code  = $sms_service->checkSmsCode('Login', $mobile, $smsCode);
        if ($check_code['code'] != 200) {
            return $check_code['code'];
        }
        return 200;
    }

    return 200;
}

if(! function_exists('mobileDesens')){
    /**
     *  手机号脱敏
     * @return string
     */
    function mobileDesens($mobile)
    {
        return strstr($mobile,substr($mobile,-8),true).'****'.substr($mobile,-4);
    }
}

if(! function_exists('emailDesens')){
    /**
     *  手机号脱敏
     * @return string
     */
    function emailDesens($email)
    {
        $startEmail = strstr($email,'@',true);
        $endEmail = strstr($email,'@');
        return strstr($startEmail,substr($startEmail,-7),true).'****'.substr($startEmail,-3).$endEmail;
    }
}


function getChar($num)
{
    /*
    //php随机生成汉字 $num为生成汉字的数量
    $b = '';
    for ($i=0; $i<$num; $i++) {
        // 使用chr()函数拼接双字节汉字，前一个chr()为高位字节，后一个为低位字节
        $a = chr(mt_rand(0xB0,0xD0)).chr(mt_rand(0xA1, 0xF0));
        // 转码
        $b .= iconv('GB2312', 'UTF-8', $a);
    }
    return $b;
    */
    $tou     = [
        '快乐',
        '冷静',
        '醉熏',
        '潇洒',
        '糊涂',
        '积极',
        '冷酷',
        '深情',
        '粗暴',
        '温柔',
        '可爱',
        '愉快',
        '义气',
        '认真',
        '威武',
        '帅气',
        '传统',
        '潇洒',
        '漂亮',
        '自然',
        '专一',
        '听话',
        '昏睡',
        '狂野',
        '等待',
        '搞怪',
        '幽默',
        '魁梧',
        '活泼',
        '开心',
        '高兴',
        '超帅',
        '留胡子',
        '坦率',
        '直率',
        '轻松',
        '痴情',
        '完美',
        '精明',
        '无聊',
        '有魅力',
        '丰富',
        '繁荣',
        '饱满',
        '炙热',
        '暴躁',
        '碧蓝',
        '俊逸',
        '英勇',
        '健忘',
        '故意',
        '无心',
        '土豪',
        '朴实',
        '兴奋',
        '幸福',
        '淡定',
        '不安',
        '阔达',
        '孤独',
        '独特',
        '疯狂',
        '时尚',
        '落后',
        '风趣',
        '忧伤',
        '大胆',
        '爱笑',
        '矮小',
        '健康',
        '合适',
        '玩命',
        '沉默',
        '斯文',
        '香蕉',
        '苹果',
        '鲤鱼',
        '鳗鱼',
        '任性',
        '细心',
        '粗心',
        '大意',
        '甜甜',
        '酷酷',
        '健壮',
        '英俊',
        '霸气',
        '阳光',
        '默默',
        '大力',
        '孝顺',
        '忧虑',
        '着急',
        '紧张',
        '善良',
        '凶狠',
        '害怕',
        '重要',
        '危机',
        '欢喜',
        '欣慰',
        '满意',
        '跳跃',
        '诚心',
        '称心',
        '如意',
        '怡然',
        '娇气',
        '无奈',
        '无语',
        '激动',
        '愤怒',
        '美好',
        '感动',
        '激情',
        '激昂',
        '震动',
        '虚拟',
        '超级',
        '寒冷',
        '精明',
        '明理',
        '犹豫',
        '忧郁',
        '寂寞',
        '奋斗',
        '勤奋',
        '现代',
        '过时',
        '稳重',
        '热情',
        '含蓄',
        '开放',
        '无辜',
        '多情',
        '纯真',
        '拉长',
        '热心',
        '从容',
        '体贴',
        '风中',
        '曾经',
        '追寻',
        '儒雅',
        '优雅',
        '开朗',
        '外向',
        '内向',
        '清爽',
        '文艺',
        '长情',
        '平常',
        '单身',
        '伶俐',
        '高大',
        '懦弱',
        '柔弱',
        '爱笑',
        '乐观',
        '耍酷',
        '酷炫',
        '神勇',
        '年轻',
        '唠叨',
        '瘦瘦',
        '无情',
        '包容',
        '顺心',
        '畅快',
        '舒适',
        '靓丽',
        '负责',
        '背后',
        '简单',
        '谦让',
        '彩色',
        '缥缈',
        '欢呼',
        '生动',
        '复杂',
        '慈祥',
        '仁爱',
        '魔幻',
        '虚幻',
        '淡然',
        '受伤',
        '雪白',
        '高高',
        '糟糕',
        '顺利',
        '闪闪',
        '羞涩',
        '缓慢',
        '迅速',
        '优秀',
        '聪明',
        '含糊',
        '俏皮',
        '淡淡',
        '坚强',
        '平淡',
        '欣喜',
        '能干',
        '灵巧',
        '友好',
        '机智',
        '机灵',
        '正直',
        '谨慎',
        '俭朴',
        '殷勤',
        '虚心',
        '辛勤',
        '自觉',
        '无私',
        '无限',
        '踏实',
        '老实',
        '现实',
        '可靠',
        '务实',
        '拼搏',
        '个性',
        '粗犷',
        '活力',
        '成就',
        '勤劳',
        '单纯',
        '落寞',
        '朴素',
        '悲凉',
        '忧心',
        '洁净',
        '清秀',
        '自由',
        '小巧',
        '单薄',
        '贪玩',
        '刻苦',
        '干净',
        '壮观',
        '和谐',
        '文静',
        '调皮',
        '害羞',
        '安详',
        '自信',
        '端庄',
        '坚定',
        '美满',
        '舒心',
        '温暖',
        '专注',
        '勤恳',
        '美丽',
        '腼腆',
        '优美',
        '甜美',
        '甜蜜',
        '整齐',
        '动人',
        '典雅',
        '尊敬',
        '舒服',
        '妩媚',
        '秀丽',
        '喜悦',
        '甜美',
        '彪壮',
        '强健',
        '大方',
        '俊秀',
        '聪慧',
        '迷人',
        '陶醉',
        '悦耳',
        '动听',
        '明亮',
        '结实',
        '魁梧',
        '标致',
        '清脆',
        '敏感',
        '光亮',
        '大气',
        '老迟到',
        '知性',
        '冷傲',
        '呆萌',
        '野性',
        '隐形',
        '笑点低',
        '微笑',
        '笨笨',
        '难过',
        '沉静',
        '火星上',
        '失眠',
        '安静',
        '纯情',
        '要减肥',
        '迷路',
        '烂漫',
        '哭泣',
        '贤惠',
        '苗条',
        '温婉',
        '发嗲',
        '会撒娇',
        '贪玩',
        '执着',
        '眯眯眼',
        '花痴',
        '想人陪',
        '眼睛大',
        '高贵',
        '傲娇',
        '心灵美',
        '爱撒娇',
        '细腻',
        '天真',
        '怕黑',
        '感性',
        '飘逸',
        '怕孤独',
        '忐忑',
        '高挑',
        '傻傻',
        '冷艳',
        '爱听歌',
        '还单身',
        '怕孤单',
        '懵懂'
    ];
    $do      = ["的", "爱", "", "与", "给", "扯", "和", "用", "方", "打", "就", "迎", "向", "踢", "笑", "闻", "有", "等于", "保卫", "演变"];
    $wei     = [
        '嚓茶',
        '凉面',
        '便当',
        '毛豆',
        '花生',
        '可乐',
        '灯泡',
        '哈密瓜',
        '野狼',
        '背包',
        '眼神',
        '缘分',
        '雪碧',
        '人生',
        '牛排',
        '蚂蚁',
        '飞鸟',
        '灰狼',
        '斑马',
        '汉堡',
        '悟空',
        '巨人',
        '绿茶',
        '自行车',
        '保温杯',
        '大碗',
        '墨镜',
        '魔镜',
        '煎饼',
        '月饼',
        '月亮',
        '星星',
        '芝麻',
        '啤酒',
        '玫瑰',
        '大叔',
        '小伙',
        '哈密瓜，数据线',
        '太阳',
        '树叶',
        '芹菜',
        '黄蜂',
        '蜜粉',
        '蜜蜂',
        '信封',
        '西装',
        '外套',
        '裙子',
        '大象',
        '猫咪',
        '母鸡',
        '路灯',
        '蓝天',
        '白云',
        '星月',
        '彩虹',
        '微笑',
        '摩托',
        '板栗',
        '高山',
        '大地',
        '大树',
        '电灯胆',
        '砖头',
        '楼房',
        '水池',
        '鸡翅',
        '蜻蜓',
        '红牛',
        '咖啡',
        '机器猫',
        '枕头',
        '大船',
        '诺言',
        '钢笔',
        '刺猬',
        '天空',
        '飞机',
        '大炮',
        '冬天',
        '洋葱',
        '春天',
        '夏天',
        '秋天',
        '冬日',
        '航空',
        '毛衣',
        '豌豆',
        '黑米',
        '玉米',
        '眼睛',
        '老鼠',
        '白羊',
        '帅哥',
        '美女',
        '季节',
        '鲜花',
        '服饰',
        '裙子',
        '白开水',
        '秀发',
        '大山',
        '火车',
        '汽车',
        '歌曲',
        '舞蹈',
        '老师',
        '导师',
        '方盒',
        '大米',
        '麦片',
        '水杯',
        '水壶',
        '手套',
        '鞋子',
        '自行车',
        '鼠标',
        '手机',
        '电脑',
        '书本',
        '奇迹',
        '身影',
        '香烟',
        '夕阳',
        '台灯',
        '宝贝',
        '未来',
        '皮带',
        '钥匙',
        '心锁',
        '故事',
        '花瓣',
        '滑板',
        '画笔',
        '画板',
        '学姐',
        '店员',
        '电源',
        '饼干',
        '宝马',
        '过客',
        '大白',
        '时光',
        '石头',
        '钻石',
        '河马',
        '犀牛',
        '西牛',
        '绿草',
        '抽屉',
        '柜子',
        '往事',
        '寒风',
        '路人',
        '橘子',
        '耳机',
        '鸵鸟',
        '朋友',
        '苗条',
        '铅笔',
        '钢笔',
        '硬币',
        '热狗',
        '大侠',
        '御姐',
        '萝莉',
        '毛巾',
        '期待',
        '盼望',
        '白昼',
        '黑夜',
        '大门',
        '黑裤',
        '钢铁侠',
        '哑铃',
        '板凳',
        '枫叶',
        '荷花',
        '乌龟',
        '仙人掌',
        '衬衫',
        '大神',
        '草丛',
        '早晨',
        '心情',
        '茉莉',
        '流沙',
        '蜗牛',
        '战斗机',
        '冥王星',
        '猎豹',
        '棒球',
        '篮球',
        '乐曲',
        '电话',
        '网络',
        '世界',
        '中心',
        '鱼',
        '鸡',
        '狗',
        '老虎',
        '鸭子',
        '雨',
        '羽毛',
        '翅膀',
        '外套',
        '火',
        '丝袜',
        '书包',
        '钢笔',
        '冷风',
        '八宝粥',
        '烤鸡',
        '大雁',
        '音响',
        '招牌',
        '胡萝卜',
        '冰棍',
        '帽子',
        '菠萝',
        '蛋挞',
        '香水',
        '泥猴桃',
        '吐司',
        '溪流',
        '黄豆',
        '樱桃',
        '小鸽子',
        '小蝴蝶',
        '爆米花',
        '花卷',
        '小鸭子',
        '小海豚',
        '日记本',
        '小熊猫',
        '小懒猪',
        '小懒虫',
        '荔枝',
        '镜子',
        '曲奇',
        '金针菇',
        '小松鼠',
        '小虾米',
        '酒窝',
        '紫菜',
        '金鱼',
        '柚子',
        '果汁',
        '百褶裙',
        '项链',
        '帆布鞋',
        '火龙果',
        '奇异果',
        '煎蛋',
        '唇彩',
        '小土豆',
        '高跟鞋',
        '戒指',
        '雪糕',
        '睫毛',
        '铃铛',
        '手链',
        '香氛',
        '红酒',
        '月光',
        '酸奶',
        '银耳汤',
        '咖啡豆',
        '小蜜蜂',
        '小蚂蚁',
        '蜡烛',
        '棉花糖',
        '向日葵',
        '水蜜桃',
        '小蝴蝶',
        '小刺猬',
        '小丸子',
        '指甲油',
        '康乃馨',
        '糖豆',
        '薯片',
        '口红',
        '超短裙',
        '乌冬面',
        '冰淇淋',
        '棒棒糖',
        '长颈鹿',
        '豆芽',
        '发箍',
        '发卡',
        '发夹',
        '发带',
        '铃铛',
        '小馒头',
        '小笼包',
        '小甜瓜',
        '冬瓜',
        '香菇',
        '小兔子',
        '含羞草',
        '短靴',
        '睫毛膏',
        '小蘑菇',
        '跳跳糖',
        '小白菜',
        '草莓',
        '柠檬',
        '月饼',
        '百合',
        '纸鹤',
        '小天鹅',
        '云朵',
        '芒果',
        '面包',
        '海燕',
        '小猫咪',
        '龙猫',
        '唇膏',
        '鞋垫',
        '羊',
        '黑猫',
        '白猫',
        '万宝路',
        '金毛',
        '山水',
        '音响',
        '尊云',
        '西安'
    ];
    $tou_num = rand(0, 331);
    $do_num  = rand(0, 19);
    $wei_num = rand(0, 327);
    $type    = rand(0, 1);
    if ($type == 0) {
        $username = $tou[$tou_num] . $do[$do_num] . $wei[$wei_num];
    } else {
        $username = $wei[$wei_num] . $tou[$tou_num];
    }
    return $username;
}

/*
* array unique_rand( int $min, int $max, int $num )
* 生成一定数量的不重复随机数
* $min 和 $max: 指定随机数的范围
* $num: 指定生成数量
*/
function unique_rand(int $min = 1000000000, int $max = 9999999999, int $num = 1)
{
    $count  = 0;
    $return = [];
    while ($count < $num) {
        $return[] = mt_rand($min, $max);
        $return   = array_flip(array_flip($return));
        $count    = count($return);
    }
    shuffle($return);
    return $return[0];
}


/**
 * 递增或递减
 *
 * @param string $table  表
 * @param int    $video_id
 * @param string $filed  自增，递减字段
 * @param array  $where  条件
 * @param string $type   inc自增，dec递减
 * @param int    $amount 自增，递减数
 *
 * @return bool
 */
function incrementAndDecrement(string $table, string $filed, array $where, $type = 'inc', $amount = 1): bool
{
    if ($type == 'inc') {
        $res = DB::table($table)->where($where)->increment($filed, $amount);
    } else {
        $res = DB::table($table)->where($where)->decrement($filed, $amount);
    }
    if ($res) {
        return true;
    }
    return false;
}

/**
 * 验证支付密码
 * @param int    $user_id
 * @param string $pay_pwd
 * @return array
 */
function checkPayPwd(int $user_id, string $pay_pwd): array
{
    $user = DB::table('users')->select(['id', 'pay_pwd'])->where('id', $user_id)->first();
    if (!$user) {
        return ['code' => 60001, 'msg' => '用户不存在'];
    }

    $redis_cache = new StringCache();
    //定义redis key
    $key = 'checkPayPwd' . ': user_id_' . $user_id;
    $redis_cache->setKeyParameter(['prefix' => $key]);
    $redis_code = $redis_cache->get();
    if ($redis_code == 5 || $redis_code > 5) {
        return ['code' => 12026, 'msg' => '支付密码输入次数超限，请明日再试'];
    }
    if (md5($pay_pwd) == $user->pay_pwd) {
        return ['code' => 0, 'msg' => ''];
    }
    if (is_null($redis_code)) {
        $redis_code = 0;
    }
    if ($redis_code == 0) {
        $ttl = strtotime(date('Y-m-d') . '23:59:59') - time();
        $redis_cache->setEx(1, $ttl);
        $redis_code += 1;
    }
    $redis_cache->increaseByInt(1);
    $num = 5 - $redis_code;
    return ['code' => 60007, 'msg' => '支付密码错误，你还有' . $num . '次机会'];
}

/**
 * 返回直播间热度
 *
 * @param int $praised_num      点赞
 * @param int $live_barrage_num 弹幕
 * @param int $audienceTotal    在线人数
 * @param int $hot              热度值
 *
 * @return int
 */
function censusHeat(int $praised_num, int $live_barrage_num, int $audienceTotal, int $hot): int
{
    //return $audienceTotal + $live_barrage_num * 2 + $praised_num * 2 + $hot;
    return $audienceTotal + $live_barrage_num * 2 + $praised_num * 2;
}

/**
 * @param $arr
 * @param $key
 *
 * @return array
 */
function arrayChangeKey($arr, $key)
{
    $processedArr = [];
    if (is_array($arr) && !empty($arr)) {
        foreach ($arr as $item) {
            $processedArr[$item[$key]] = empty($item) ? '' : $item;
        }
    }
    return $processedArr;
}

/*
 * 返回数组中指定多列
 * @param  Array  $input       需要取出数组列的多维数组
 * @param  String $column_keys 要取出的列名，逗号分隔，如不传则返回所有列
 * @param  String $index_key   作为返回数组的索引的列
 * @return Array
 */
function array_columns($input, $column_keys = null, $index_key = null)
{
    $result = [];
    $keys   = isset($column_keys) ? explode(',', $column_keys) : [];
    if ($input) {
        foreach ($input as $k => $v) {
            // 指定返回列
            if ($keys) {
                $tmp = [];
                foreach ($keys as $key) {
                    $tmp[$key] = $v[$key];
                }
            } else {
                $tmp = $v;
            }
            // 指定索引列
            if (isset($index_key)) {
                $result[$v[$index_key]] = $tmp;
            } else {
                $result[] = $tmp;
            }

        }
    }
    return $result;
}


/**
 * @param $msg
 * @param $mobile
 *
 * @return bool|string
 */
function sendSMS($msg, $mobile)
{
    $smsConfig = config('SmsMessage');
    //创蓝接口参数
    $postFields = [
        'account'  => $smsConfig['account'],//N5534544
        'password' => $smsConfig['password'],//4XVngtv6h
        'msg'      => urlencode($msg),
        'phone'    => $mobile,
        'report'   => 'true'
    ];
    $postFields = json_encode($postFields);
    $ch         = curl_init();
    curl_setopt($ch, CURLOPT_URL, $smsConfig['send_url']);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json; charset=utf-8']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $ret = curl_exec($ch);

    if (false == $ret) {

        $result = curl_error($ch);
    } else {

        $rsp = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if (200 != $rsp) {
            $result = "请求状态 " . $rsp . " " . curl_error($ch);
        } else {
            $result = $ret;
        }
    }
    //Log::info('duanxin',['duanxin'=>$result]);
    curl_close($ch);
    return $result;
}


/**
 * @param string       $url       地址
 * @param array|string $option    参数
 * @param array        $header    header头
 * @param int          $type      1:POST 2:GET
 * @param int          $call_type 1为正常调用，2为异步回调调用
 *
 * @return mixed
 */
function postCurl($url = '', $option = '', array $header = [], $type = 1, $call_type = 1)
{

    try {

        if ($type == 1) {
            $type = 'POST';
        } else {
            $type = 'GET';
        }

        $curl = curl_init(); // 启动一个CURL会话
        // 连接建立最长耗时
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_HTTPPROXYTUNNEL, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                                            // 对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,
            false);                                                                                   // 从证书中检查SSL加密算法是否存在
        curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); // 模拟用户使用的浏览器
        curl_setopt($curl, CURLOPT_POSTFIELDS, $option);
        if (!empty ($option)) {
            if (is_array($option)) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($option)); // Post提交的数据包
            } else {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $option); // Post提交的数据包
            }
        }
        if (empty($header)) {
            $header = [
                'content-type: application/x-www-form-urlencoded;charset=utf-8',
            ];
        }
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);  // 设置HTTP头
        curl_setopt($curl, CURLOPT_TIMEOUT, 60);          // 设置超时限制防止死循环
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 获取的信息以文件流的形式返回
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $type);
        $result = curl_exec($curl); // 执行操作
        $res    = [];
        if ($call_type == 1) {
            $res            = json_decode($result, true);
            $res ['status'] = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        } elseif ($call_type == 2) {

            $res['result']  = trim($result);
            $res ['status'] = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        }

        curl_close($curl); // 关闭CURL会话
        return $res;

    } catch (Exception $e) {
        $message = $e->getMessage();
    }
}


function getRandom($param)
{
    $str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $key = "";
    for ($i = 0; $i < $param; $i++) {
        $key .= $str[mt_rand(0, 32)];    //生成php随机数
    }
    return $key;
}

/**
 *
 * @return string
 */
function getOrder()
{
    return date('Ymd') . substr(implode(null, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 10);
}

/**
 * 检查手机号码格式
 *
 * @param $mobile 手机号码
 *
 * @return bool
 */
function check_mobile($mobile)
{
    if (preg_match('/1[3456789]\d{9}$/', $mobile)) {
        return true;
    }
    return false;
}

/**
 * 检查固定电话
 *
 * @param $mobile
 *
 * @return bool
 */
function check_telephone($mobile)
{
    if (preg_match('/^([0-9]{3,4}-)?[0-9]{7,8}$/', $mobile)) {
        return true;
    }
    return false;
}


/**
 * 获取当前日期在一年中的天数
 *
 * @param int $month 月
 * @param int $day   日
 * @param int $year  年
 *
 * @return false|string
 */
function getDays($month, $day, $year)
{
    return date('z', mktime(0, 0, 0, $month, $day, $year));
}


/**
 * 计算两日期间隔天数
 *
 * @param $day1
 * @param $day2
 *
 * @return float|int
 */
function diffTwoDays($day1, $day2)
{
    $second1 = strtotime($day1);
    $second2 = strtotime($day2);

    if ($second1 < $second2) {
        $tmp     = $second2;
        $second2 = $second1;
        $second1 = $tmp;
    }
    return ($second1 - $second2) / 86400;
}


function scandirFolder($path)
{

    $list = [];

    $temp_list = scandir($path);

    foreach ($temp_list as $file) {

        //排除根目录

        if ($file != ".." && $file != ".") {

            if (is_dir($path . "/" . $file)) {

                //子文件夹，进行递归

                $list[$file] = scandirFolder($path . "/" . $file);

            } else {

                //根目录下的文件

                $list[] = $file;

            }

        }

    }

    return $list;

}


/**
 * 获取客户端ip
 *
 * @return mixed|string
 */
function get_real_ip()
{
    $ip = false;
    //客户端IP 或 NONE
    if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    }
    //多重代理服务器下的客户端真实IP地址（可能伪造）,如果没有使用代理，此字段为空
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ips = explode(", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
        if ($ip) {
            array_unshift($ips, $ip);
            $ip = false;
        }
        for ($i = 0; $i < count($ips); $i++) {
            if (!preg_match('/^(10│172.16│192.168).$/', $ips[$i])) {
                $ip = $ips[$i];
                break;
            }
        }
    }
    //客户端IP 或 (最后一个)代理服务器 IP
    return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}


/**
 * 计算时间差
 *
 * @param int $timestamp1 时间戳开始
 * @param int $timestamp2 时间戳结束
 *
 * @return array
 */
function time_diff($timestamp1, $timestamp2)
{
    if ($timestamp2 <= $timestamp1) {
        return ['hours' => 0, 'minutes' => 0, 'seconds' => 0];
    }
    $timediff = $timestamp2 - $timestamp1;
    // 时
    $remain = $timediff % 86400;
    $hours  = intval($remain / 3600);
    // 分
    $remain = $timediff % 3600;
    $mins   = intval($remain / 60);
    // 秒
    $secs = $remain % 60;
    $time = ['hours' => $hours, 'minutes' => $mins, 'seconds' => $secs];
    return $time;
}


/**
 * 中文字符串截取
 *
 * @param $position //位置
 * @param $str      //内容
 *
 * @return string
 */
function mbSubstr($position, $str)
{
    $content  = '';
    $str      = trim($str, ',');
    $mbStrlen = mb_strlen($str, 'utf-8');
    $content  = mb_substr($str, $position, $mbStrlen, 'utf-8');
    return $content;
}

//组装推送推荐数据格式
function runAliAirecData($cmd, $data)
{
    $list = [];
    foreach ($data as $key => $value) {
        $_data  = ['cmd' => $cmd, 'fields' => $value];
        $list[] = $_data;
    }

    return json_encode($list);
}

//根据发布时间获取结算周期
function getPlayRedPacketTime($release_time)
{
    $release_time = strtotime($release_time);
    $_start_time  = $release_time;
    $_end_time    = $_start_time + 24 * 3600;
    return ['startTime' => $_start_time, 'endTime' => $_end_time];
}


/**
 * 获取毫秒级时间戳
 *
 * @return float
 */
function msectime()
{
    [$msec, $sec] = explode(' ', microtime());
    $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
    return $msectime;
}


/**
 * 二维数组根据某个字段排序
 *
 * @param array $array 要排序的数组
 * @param string $keys 要排序的键字段
 * @param int $sort 排序类型  SORT_ASC     SORT_DESC
 *
 * @return array 排序后的数组
 */
function arraySort($array, $keys, $sort = SORT_DESC)
{
    $keysValue = [];
    foreach ($array as $k => $v) {
        $keysValue[$k] = $v[$keys];
    }
    array_multisort($keysValue, $sort, $array);
    return $array;
}

/**
 * 根据ip获取所属城市
 * @param string $ip
 * @return mixed|string
 */
function getProvinceCity($ip = '')
{
    if(empty($ip)){
        $ip = get_real_ip();
    }

    $url    = 'https://restapi.amap.com/v3/ip?key=e59e7c08df2c21c9592a3e787a8154c8&type=4&ip=' . $ip;
    $data   = file_get_contents($url);
    $json   = json_decode($data, true);
    $region = [
        'province' => '',
        'city' => '',
    ];
    if ($json['infocode'] == 10000) {
        $region['province'] = empty($json['province']) ? '' : $json['province'];
        $region['city'] = empty($json['city']) ? '' : $json['city'];
    }
    return $region;
}

/**
 * 获取用户的城市code
 * $ip = '180.149.130.16'
 * @return adcode 城市编码
 */
function getCityAdcode($ip = '')
{
    if(empty($ip)){
        $ip = get_real_ip();
    }

    $url    = 'https://restapi.amap.com/v3/ip?key=e59e7c08df2c21c9592a3e787a8154c8&type=4&ip=' . $ip;
    $data   = file_get_contents($url);
    $json   = json_decode($data, true);
    $adcode = '0';
    if ($json['infocode'] == 10000) {
        if (!empty($json['adcode'])) {
            $adcode = $json['adcode'];
        }
    }
    return $adcode;
}

/**
 * 根据经纬度逆推城市
 *
 * @param  [type] $location 经纬度
 *
 * @return [type]           [description]
 */
function getGeocodeRegeo($location)
{
    $url    = 'https://restapi.amap.com/v3/geocode/regeo?key=e59e7c08df2c21c9592a3e787a8154c8&location=' . $location;
    $data   = file_get_contents($url);
    $json   = json_decode($data, true);
    $adcode = '';
    if ($json['infocode'] == 10000) {
        if (!empty($json['regeocode']['addressComponent']['adcode'])) {
            $adcode = $json['regeocode']['addressComponent']['adcode'];
        }
    }
    return $adcode;
}


/**
 * 获取redis分页起始和结束
 *
 * @param  [type] $per_page     每页数量
 * @param  [type] $current_page 页码
 *
 * @return [type]               [description]
 */
function getPageStartEnd($per_page, $current_page)
{
    $start = ($current_page - 1) * $per_page;
    $stop  = $start + ($per_page - 1);
    return ['start' => $start, 'stop' => $stop];
}

if (!function_exists("mb_str_encode")) {
    /**
     *
     * @param $str
     *
     * @return array|false|string|string[]|null
     */
    function mb_str_encode($str)
    {
        if (!$str) {
            return "";
        }
        $encode = mb_detect_encoding($str, ["ASCII", 'UTF-8', "GB2312", "GBK", 'BIG5']);
        return mb_convert_encoding($str, 'UTF-8', $encode);

    }
}

if (!function_exists("millisecondWay")) {
    /**
     * 获取毫秒
     *
     * @return float
     */
    function getMillisecond()
    {
        [$s1, $s2] = explode(' ', microtime());
        return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000);
    }
}

if (!function_exists("strToHump")) {
    /**
     * 字符串以_转驼峰
     * @param $str
     *
     * @return array|string|string[]|null
     */
    function strToHump($str)
    {

        return preg_replace_callback('/_+([a-z])/', function ($matches) {
            return strtoupper($matches[1]);
        }, $str);
    }
}
if (!function_exists("specialStringEscape")){
    /**
     * 特殊字符串转义或过滤
     * @param $keyword
     *
     * @return array|mixed|string|string[]
     */
    function specialStringEscape($keyword,$isFilter=false)
    {
        $strList = [
            '\\','+', '-','!','(',')',':','^','[',']','"','{', '}', '~','*','?','|','&','/', '#','@','（','）', '>'
            ,'<','“','”','？','、','.'
        ];
        $keywordList =preg_split('/(?<!^)(?!$)/u', $keyword );
        $intersect = array_intersect($strList,$keywordList);
        if (empty($intersect)){
            return $keyword;
        }
        foreach ($intersect as $item){
            if ($isFilter){
                $keyword = str_replace($item,"",$keyword);
            }else{
                $keyword = str_replace($item,'\\'.$item,$keyword);
            }
        }
        return $keyword;
    }
}
if (!function_exists("formatCurrentTime")) {
    /**
     * 当前时间格式化
     * 刚刚:一分钟内
     * n分钟前:一小时内
     * n小时前:一天内
     * 7天内:一周内
     * 一周外,当前内:m-d
     * 当年外:Y-m-d
     *
     * @param $time
     *
     * @return string
     */
    function formatCurrentTime($time)
    {
        $nowtime    = time();
        $difference = $nowtime - $time;
        switch ($difference) {
            case $difference <= 60 :
                $msg = '刚刚';
                break;
            case $difference > 60 && $difference <= 3600:
                $msg = floor($difference / 60) . '分钟前';
                break;
            case $difference > 3600 && $difference <= 86400:
                $msg = floor($difference / 3600) . '小时前';
                break;
            case $difference > 86400 && $difference <= 604800 :
                $msg = floor($difference / 86400) . '天前';
                break;
            case $difference > 604800 && $difference < ($nowtime - strtotime(date("Y")."-01-01")):
                $msg = date('m-d', $time);
                break;
            default:
                $msg = date('Y-m-d', $time);
                break;
        }
        return $msg;
    }

    if (!function_exists("ExcelImport")) {
        /**
         * 创建(导出)Excel数据表格
         *
         * @param array  $list     要导出的数组格式的数据
         * @param string $filename 导出的Excel表格数据表的文件名
         * @param array  $header   Excel表格的表头
         * @param array  $index    $list数组中与Excel表格表头$header中每个项目对应的字段的名字(key值)
         *                         比如: $header = array('编号','姓名','性别','年龄');
         *                         $index = array('id','username','sex','age');
         *                         $list = array(array('id'=>1,'username'=>'YQJ','sex'=>'男','age'=>24));
         *
         * @return [array] [数组]
         */
        function ExcelImport($list, $filename, $header = [], $index = [])
        {
            header("Content-type:application/vnd.ms-excel");
            header("Content-Disposition:filename=" . $filename . ".xls");
            $teble_header = implode("\t", $header);
            $strexport    = $teble_header . "\r";
            foreach ($list as $row) {
                foreach ($index as $val) {
                    $strexport .= $row[$val] . "\t";
                }
                $strexport .= "\r";

            }
            $strexport = iconv('UTF-8', "GB2312//IGNORE", $strexport);
            exit($strexport);
        }
    }

    if (!function_exists("ESLog")) {
        /**
         * ES日志
         *
         * @param $indexName
         * @param $response
         * @param $errorType
         * @param $source
         *
         * @return bool
         * @throws Exception
         *
         */
        function ESLog($indexName, $response, $errorType, $source)
        {
            $info     = [
                "response"   => $response,
                "error_type" => $errorType,
                "source"     => $source,
                "time"       => date("Y-m-d H:i:s"),
            ];
            $log_list = config("ESLog", []) ?? [];
            if (!empty($log_list) && in_array($indexName, $log_list)) {
                $es = ElasticSearch::instance();
                $es->index($indexName)->data($info)->saveOne();
                return true;
            }
            return false;
        }
    }


    /**
     * Mutibyte string replace.
     * @param  string $string  原始字符串
     * @param  string $replace  替换后字符串
     * @param  int    $position  替换起始位置
     * @param  int    $length    替换长度
     */
    if (!function_exists("mb_substr_replace")) {
        function mb_substr_replace($string, $replace, $position, $length) {
            $str = mb_substr($string, 0, $position).$replace;
            return $str.mb_substr($string, (mb_strlen($str) + $length));
        }
    }

    if (!function_exists("week_cycle")) {
        /**
         * 获取当前周信息
         * currentDay 今天日期
         * w     今天周几 0-6   0周日
         * start 当前周开始时间
         * end   当前周结束时间
         * @return array
         */
        function week_cycle()
        {
            $currentDate = date("Y-m-d");
            $w           = date('w', strtotime($currentDate));
            $week_start  = date("Y-m-d", strtotime("$currentDate -" . ($w ? $w - 1 : 6) . " days"));
            $week_end    = date("Y-m-d", strtotime("$week_start +6 days"));
            $info        = [
                "currentDay" => $currentDate,
                "w"          => $w,
                "start"      => $week_start,
                "end"        => $week_end
            ];
            return $info;
        }

    }

    if (! function_exists('bcrypt')) {
        /**
         * Hash the given value against the bcrypt algorithm.
         *
         * @param  string  $value
         * @param  array  $options
         * @return string
         */
        function bcrypt($value, $options = [])
        {
            return app('hash')->driver('bcrypt')->make($value, $options);
        }
    }

    if (! function_exists('sendEmail')) {
        /**
         * send email
         * @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
         */
        function sendEmail(string $from, string $to, string $html,string $subject='blog', string $text='blog')
        {
            $dsn = config('blogConfig.wy_email_server');
            if (env('EMAIL_CONFIG') == 'qq'){
                $dsn = config('blogConfig.qq_email_server');
            }

            $transport = Transport::fromDsn($dsn);
            $mailer    = new Mailer($transport);
            $email     = (new Email())
                ->from($from)
                ->to($to)
                //->cc('cc@example.com')
                //->bcc('bcc@example.com')
                //->replyTo('fabien@example.com')
                //->priority(Email::PRIORITY_HIGH)
                ->subject($subject)
                ->text($text)
                ->html('<p>'.$html.'</p>');
            $mailer->send($email);
        }
    }

}
